#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量将CSV文件表头转换为纯英文格式
"""

import os
import pandas as pd
import glob
import re

# 定义中文(英文)或中文到英文的映射
CHINESE_TO_ENGLISH_MAPPING = {
    # 基础字段
    '日期(date)': 'date',
    '日期': 'date',
    '收益率(returns)': 'returns',
    '收益率': 'returns',
    '现金(cash)': 'cash',
    '现金': 'cash',
    '持仓(holdings)': 'holdings',
    '持仓': 'holdings',
    
    # 统计指标
    '年化收益率(Annual Return)': 'Annual Return',
    '年化收益率-Annual Return': 'Annual Return',
    '年化收益率': 'Annual Return',
    '累计收益率(Cumulative Returns)': 'Cumulative Returns',
    '累计收益率-cumulated return': 'Cumulative Returns',
    '累计收益率': 'Cumulative Returns',
    '年化波动率(Annual Volatility)': 'Annual Volatility',
    '年化波动率': 'Annual Volatility',
    '夏普比率(Sharpe Ratio)': 'Sharpe Ratio',
    '夏普比率': 'Sharpe Ratio',
    '卡尔玛比率(Calmar Ratio)': 'Calmar Ratio',
    '卡尔玛比率': 'Calmar Ratio',
    '稳定性(Stability)': 'Stability',
    '稳定性': 'Stability',
    '最大回撤(Max Drawdown)': 'Max Drawdown',
    '最大回撤': 'Max Drawdown',
    '欧米茄比率(Omega Ratio)': 'Omega Ratio',
    '欧米茄比率': 'Omega Ratio',
    '索提诺比率(Sortino Ratio)': 'Sortino Ratio',
    '索提诺比率': 'Sortino Ratio',
    '偏度(Skew)': 'Skew',
    '偏度': 'Skew',
    '峰度(Kurtosis)': 'Kurtosis',
    '峰度': 'Kurtosis',
    '尾部比率(Tail Ratio)': 'Tail Ratio',
    '尾部比率': 'Tail Ratio',
    '日风险价值(Daily VaR)': 'Daily VaR',
    '日风险价值': 'Daily VaR',
    '阿尔法(Alpha)': 'Alpha',
    '阿尔法': 'Alpha',
    '贝塔(Beta)': 'Beta',
    '贝塔': 'Beta',
    
    # 时间相关
    '开始日期(Start)': 'Start',
    '开始日期': 'Start',
    '结束日期(End)': 'End',
    '结束日期': 'End',
    '持续时间(Duration)': 'Duration',
    '持续时间': 'Duration',
    '峰值(Peak)': 'Peak',
    '峰值': 'Peak',
    '谷值(Valley)': 'Valley',
    '谷值': 'Valley',
    
    # 交易相关
    '总杠杆(Gross Leverage)': 'Gross Leverage',
    '总杠杆率(gross_leverage)': 'Gross Leverage',
    '总杠杆': 'Gross Leverage',
    '净杠杆(Net Leverage)': 'Net Leverage',
    '净杠杆': 'Net Leverage',
    '多头杠杆(Long Leverage)': 'Long Leverage',
    '多头杠杆': 'Long Leverage',
    '空头杠杆(Short Leverage)': 'Short Leverage',
    '空头杠杆': 'Short Leverage',
    '换手率(Turnover)': 'Turnover',
    '换手率(turnover)': 'Turnover',
    '换手率': 'Turnover',
    '交易次数(Transactions)': 'Transactions',
    '交易次数': 'Transactions',
    '成交量(Volume)': 'Volume',
    '成交量': 'Volume',
    '滑点(Slippage)': 'Slippage',
    '滑点': 'Slippage',
    
    # 分布相关
    '数量(Count)': 'Count',
    '数量': 'Count',
    '均值(Mean)': 'Mean',
    '均值': 'Mean',
    '标准差(Std)': 'Std',
    '标准差': 'Std',
    '最小值(Min)': 'Min',
    '最小值': 'Min',
    '最大值(Max)': 'Max',
    '最大值': 'Max',
    '中位数(Median)': 'Median',
    '中位数': 'Median',
    '第一四分位数(Q1)': 'Q1',
    '第一四分位数': 'Q1',
    '第三四分位数(Q3)': 'Q3',
    '第三四分位数': 'Q3',
    
    # 月度相关
    '一月(Jan)': 'Jan',
    '一月': 'Jan',
    '二月(Feb)': 'Feb',
    '二月': 'Feb',
    '三月(Mar)': 'Mar',
    '三月': 'Mar',
    '四月(Apr)': 'Apr',
    '四月': 'Apr',
    '五月(May)': 'May',
    '五月': 'May',
    '六月(Jun)': 'Jun',
    '六月': 'Jun',
    '七月(Jul)': 'Jul',
    '七月': 'Jul',
    '八月(Aug)': 'Aug',
    '八月': 'Aug',
    '九月(Sep)': 'Sep',
    '九月': 'Sep',
    '十月(Oct)': 'Oct',
    '十月': 'Oct',
    '十一月(Nov)': 'Nov',
    '十一月': 'Nov',
    '十二月(Dec)': 'Dec',
    '十二月': 'Dec',
    '年度(Year)': 'Year',
    '年份(Year)': 'Year',
    '年度': 'Year',
    '年份': 'Year',
    
    # 其他常见字段
    '代码(Symbol)': 'Symbol',
    '代码': 'Symbol',
    '价格(Price)': 'Price',
    '价格': 'Price',
    '权重(Weight)': 'Weight',
    '权重': 'Weight',
    '配置(Allocation)': 'Allocation',
    '配置': 'Allocation',
    '敞口(Exposure)': 'Exposure',
    '敞口': 'Exposure',
    '损益(PnL)': 'PnL',
    '损益': 'PnL',
    '佣金(Commission)': 'Commission',
    '佣金': 'Commission',
    
    # 特殊字段
    '年-year': 'Year',
    '年收益率-annual return%': 'Annual Return %',
    '日期-date': 'date',
    '多头(long)': 'Long',
    '空头(short)': 'Short',
    '净敞口(net)': 'Net',
    '日交易量(shares)': 'Daily Shares',
    '回撤比率(Drawdown Rate %)': 'Drawdown Rate %',
    '回撤比率-drawdown%': 'Drawdown %',
    '高点日期-peak date': 'Peak Date',
    '低点日期-valley date': 'Valley Date',
    '恢复日期-recovery date': 'Recovery Date',
    '期间长度-duration': 'Duration',
    '滑点（bps）-Slippage (bps)': 'Slippage (bps)',
    '月收益率(monthly_return)': 'Monthly Return',
    '持仓天数(Holding Days)': 'Holding Days',
    '分箱起点(Bin Start)': 'Bin Start',
    '分箱终点(Bin End)': 'Bin End',
    '频数(Frequency)': 'Frequency',
    '周期(Period)': 'Period',
    '下限(Lower Bound)': 'Lower Bound',
    '上限(Upper Bound)': 'Upper Bound',
    '盈利交易的概率(Probability of Profitable Trade)': 'Probability of Profitable Trade',
    '概率密度(Probability Density)': 'Probability Density',
    '指标(Metric)': 'Metric',
    '所有交易(All)': 'All',
    '做空交易(Short)': 'Short',
    '做多交易(Long)': 'Long',
    '策略6个月滚动波动率(6-Month Rolling Volatility)': '6-Month Rolling Volatility',
    '策略6个月滚动夏普比率(6-Month Rolling Sharpe Ratio)': '6-Month Rolling Sharpe Ratio',
    
    # 通用字段
    '指标': 'Metric',
    '值': 'Value',
    '做多最大': 'Max Long',
    '做多中值': 'Median Long',
    '做空中值': 'Median Short',
    '做空最大': 'Max Short',
}

def extract_english_from_parentheses(header):
    """从中文(英文)格式中提取英文部分"""
    match = re.search(r'\(([^)]+)\)', header)
    if match:
        return match.group(1)
    return None

def convert_header_to_english(header):
    """将表头转换为英文"""
    # 直接映射
    if header in CHINESE_TO_ENGLISH_MAPPING:
        return CHINESE_TO_ENGLISH_MAPPING[header]
    
    # 如果是中文(英文)格式，提取英文部分
    english_part = extract_english_from_parentheses(header)
    if english_part:
        return english_part
    
    # 如果已经是英文，保持不变
    if re.match(r'^[a-zA-Z0-9\s\-_/:.%]+$', header):
        return header
    
    # 其他情况保持原样（可能需要手动处理）
    return header

def get_csv_files(directory):
    """获取目录下所有CSV文件"""
    pattern = os.path.join(directory, "*.csv")
    return glob.glob(pattern)

def read_csv_headers(file_path):
    """读取CSV文件的表头"""
    try:
        df = pd.read_csv(file_path, nrows=0)
        return list(df.columns)
    except Exception as e:
        print(f"读取文件 {file_path} 失败: {e}")
        return []

def update_headers_to_english(headers):
    """将表头转换为英文"""
    updated_headers = []
    for header in headers:
        english_header = convert_header_to_english(header)
        updated_headers.append(english_header)
    return updated_headers

def update_csv_file(file_path, new_headers):
    """更新CSV文件的表头"""
    try:
        # 读取原始数据
        df = pd.read_csv(file_path)
        
        # 更新列名
        df.columns = new_headers
        
        # 保存文件
        df.to_csv(file_path, index=False, encoding='utf-8')
        print(f"已更新文件: {os.path.basename(file_path)}")
        return True
    except Exception as e:
        print(f"更新文件 {file_path} 失败: {e}")
        return False

def main():
    directory = "/Users/linda/myprojects/gitee/MoneyDoubleSignal/2025-7-18最优"
    
    # 获取所有CSV文件
    csv_files = get_csv_files(directory)
    print(f"找到 {len(csv_files)} 个CSV文件")
    
    # 处理每个文件
    updated_count = 0
    for file_path in csv_files:
        print(f"\n处理文件: {os.path.basename(file_path)}")
        
        # 读取原始表头
        original_headers = read_csv_headers(file_path)
        if not original_headers:
            continue
            
        print(f"原始表头: {original_headers}")
        
        # 转换为英文表头
        new_headers = update_headers_to_english(original_headers)
        print(f"英文表头: {new_headers}")
        
        # 如果表头有变化，更新文件
        if original_headers != new_headers:
            if update_csv_file(file_path, new_headers):
                updated_count += 1
        else:
            print("表头无需更新")
    
    print(f"\n总共更新了 {updated_count} 个文件")

if __name__ == "__main__":
    main()
